package pe.gob.foncodes.ssa.bs.seguridad.domain;

import java.io.Serializable;
import java.util.Date;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

/**
 *
 * @author Gcarlos
 */
@Entity
@Table(name = "USUARIO_AUTORIZACION", catalog = "", schema = "SSA")
@NamedQueries({
    @NamedQuery(name = "UsuarioAutorizacion.findAll", query = "SELECT u FROM UsuarioAutorizacion u"),
    @NamedQuery(name = "UsuarioAutorizacion.findByNidAccionAndNidUsuarioPerfil", query = "SELECT u FROM UsuarioAutorizacion u JOIN u.accion a WHERE a.nidOpcion.id = ?1 AND u.usuarioAutorizacionPK.nidUsuarioPerfil = ?2 "
        + "AND u.flgActivo = ?3 AND a.flgActivo = '1' ORDER BY a.flgDefault DESC, UPPER(a.txtAccion)"),
    @NamedQuery(name = "UsuarioAutorizacion.findByNidOpcionAndNidUsuarioPerfil", 
        query = "SELECT u FROM UsuarioAutorizacion u JOIN u.accion a JOIN a.nidOpcion o WHERE u.usuarioAutorizacionPK.nidUsuarioPerfil = ?1 AND o.id = ?2 AND a.flgDefault = '1' "),
    @NamedQuery(name = "UsuarioAutorizacion.findByNidUsuarioPerfilAndFlgActivo", 
        query = "SELECT ua FROM UsuarioAutorizacion ua JOIN ua.usuarioPerfil up WHERE up.id = ?1 AND ua.flgActivo = ?2 "),
    
    @NamedQuery(name = "UsuarioAutorizacion.updateFlgActivo", 
        query = "UPDATE UsuarioAutorizacion ua SET ua.flgActivo = ?1, ua.NIdCtrlAccesoWeb = ?2 WHERE ua.usuarioAutorizacionPK.nidAccion = ?3 AND ua.usuarioAutorizacionPK.nidUsuarioPerfil = ?4"),
    
    @NamedQuery(name = "UsuarioAutorizacion.updateFlgConsulta", 
        query = "UPDATE UsuarioAutorizacion ua SET ua.flgActivo = ?1, ua.flgConsulta = ?2, ua.NIdCtrlAccesoWeb = ?3 WHERE ua.usuarioAutorizacionPK.nidAccion = ?4 AND ua.usuarioAutorizacionPK.nidUsuarioPerfil = ?5"),
    
    @NamedQuery(name = "UsuarioAutorizacion.findByNidUsuarioPerfilAndNidOpcion", 
        query = "SELECT u FROM UsuarioAutorizacion u JOIN u.accion a JOIN a.nidOpcion o "
        + "WHERE u.usuarioAutorizacionPK.nidUsuarioPerfil = ?1 AND o.id = ?2 AND a.flgDefault = ?3 AND u.flgActivo = ?4"),
    
    @NamedQuery(name = "UsuarioAutorizacion.findByUsuarioPerfilFirstLevelNodes", 
        query = "SELECT op, ua.flgConsulta FROM UsuarioAutorizacion ua JOIN ua.usuarioPerfil up JOIN ua.accion ac JOIN ac.nidOpcion op "
        + "WHERE ua.usuarioAutorizacionPK.nidUsuarioPerfil = ?1 AND ua.flgActivo = ?2 AND ac.flgDefault = ?3 AND up.nidPerfil.id = ?4 AND op.nidOpcionPadre IS NULL "
        + "ORDER BY op.numOrden "),
    @NamedQuery(name = "UsuarioAutorizacion.findByUsuarioPerfilOtherLevelNodes", 
        query = "SELECT op, ua.flgConsulta FROM UsuarioAutorizacion ua JOIN ua.usuarioPerfil up JOIN ua.accion ac JOIN ac.nidOpcion op "
        + "WHERE ua.usuarioAutorizacionPK.nidUsuarioPerfil = ?1 AND ua.flgActivo = ?2 AND ac.flgDefault = ?3 AND up.nidPerfil.id = ?4 AND op.nidOpcionPadre.id = ?5 "
        + "ORDER BY op.numOrden "),
    
    @NamedQuery(name = "UsuarioAutorizacion.findByUsuarioPerfilAndModuloFirstLevelNodes", 
        query = "SELECT op, ua.flgConsulta FROM UsuarioAutorizacion ua JOIN ua.usuarioPerfil up JOIN ua.accion ac JOIN ac.nidOpcion op "
        + "WHERE ua.usuarioAutorizacionPK.nidUsuarioPerfil = ?1 AND ua.flgActivo = ?2 AND ac.flgDefault = ?3 AND up.nidPerfil.id = ?4 AND op.nidOpcionPadre IS NULL "
        + "AND op.nidModulo.id = ?5 ORDER BY op.numOrden "),
    @NamedQuery(name = "UsuarioAutorizacion.findByUsuarioPerfilAndModuloOtherLevelNodes", 
        query = "SELECT op, ua.flgConsulta FROM UsuarioAutorizacion ua JOIN ua.usuarioPerfil up JOIN ua.accion ac JOIN ac.nidOpcion op "
        + "WHERE ua.usuarioAutorizacionPK.nidUsuarioPerfil = ?1 AND ua.flgActivo = ?2 AND ac.flgDefault = ?3 AND up.nidPerfil.id = ?4 AND op.nidOpcionPadre.id = ?5 "
        + "AND op.nidModulo.id = ?6 AND op.flgActivo = '1' ORDER BY op.numOrden "),
    @NamedQuery(name = "UsuarioAutorizacion.findByNiOpcionINdUsuarioPerfil", query = "SELECT u FROM UsuarioAutorizacion u JOIN u.accion ac JOIN ac.nidOpcion op WHERE ac.flgDefault='1' AND op.id = ?1 "),
    @NamedQuery(name = "UsuarioAutorizacion.findByNiOpcionAndPadreINdUsuarioPerfil", query = "SELECT u FROM UsuarioAutorizacion u JOIN u.accion ac JOIN ac.nidOpcion op WHERE ac.flgDefault='1' AND (op.id = ?1 OR op.nidOpcionPadre.id = ?2)"),
    @NamedQuery(name = "UsuarioAutorizacion.findByNidAccionINUsuarioPerfil", query = "SELECT u FROM UsuarioAutorizacion u JOIN u.accion ac WHERE ac.id = ?1 OR ac.nidOpcion.id = ?2")
})
public class UsuarioAutorizacion implements Serializable {

    private static final long serialVersionUID = 1L;
    protected UsuarioAutorizacionPK usuarioAutorizacionPK;
    private String flgActivo;
    private Date fecInicio;
    private Date fecFin;
    private String flgCaduca;
    private String flgConsulta;
    private UsuarioPerfil usuarioPerfil;
    private Accion accion;
    private List<AutorizacionSeguimiento> autorizacionSeguimientoList;
    private Long nIdCtrlAccesoWeb;
    
    public UsuarioAutorizacion() {
    }

    @EmbeddedId
    public UsuarioAutorizacionPK getUsuarioAutorizacionPK() {
        return usuarioAutorizacionPK;
    }

    public void setUsuarioAutorizacionPK(UsuarioAutorizacionPK usuarioAutorizacionPK) {
        this.usuarioAutorizacionPK = usuarioAutorizacionPK;
    }
 
    @Column(name = "NID_CONTROL_ACCESO_WEB", precision = 0, scale = -127)
    public Long getNIdCtrlAccesoWeb() {
        return nIdCtrlAccesoWeb;
    }
    
    public void setNIdCtrlAccesoWeb(Long nIdCtrlAccesoWeb) {
        this.nIdCtrlAccesoWeb = nIdCtrlAccesoWeb;
    }
    
    @Column(name = "FLG_ACTIVO")
    public String getFlgActivo() {
        return flgActivo;
    }

    public void setFlgActivo(String flgActivo) {
        this.flgActivo = flgActivo;
    }

    @Column(name = "FEC_INICIO")
    @Temporal(TemporalType.TIMESTAMP)
    public Date getFecInicio() {
        return fecInicio;
    }

    public void setFecInicio(Date fecInicio) {
        this.fecInicio = fecInicio;
    }

    @Column(name = "FEC_FIN")
    @Temporal(TemporalType.TIMESTAMP)
    public Date getFecFin() {
        return fecFin;
    }

    public void setFecFin(Date fecFin) {
        this.fecFin = fecFin;
    }

    @Column(name = "FLG_CADUCA")
    public String getFlgCaduca() {
        return flgCaduca;
    }

    public void setFlgCaduca(String flgCaduca) {
        this.flgCaduca = flgCaduca;
    }

    @Column(name = "FLG_CONSULTA")
    public String getFlgConsulta() {
        return flgConsulta;
    }

    public void setFlgConsulta(String flgConsulta) {
        this.flgConsulta = flgConsulta;
    }

    
    @JoinColumn(name = "NID_USUARIO_PERFIL", referencedColumnName = "NID_USUARIO_PERFIL", nullable = false, insertable = false, updatable = false)
    @ManyToOne(optional = false)
    public UsuarioPerfil getUsuarioPerfil() {
        return usuarioPerfil;
    }

    public void setUsuarioPerfil(UsuarioPerfil usuarioPerfil) {
        this.usuarioPerfil = usuarioPerfil;
    }

    @JoinColumn(name = "NID_ACCION", referencedColumnName = "NID_ACCION", nullable = false, insertable = false, updatable = false)
    @ManyToOne(optional = false)
    public Accion getAccion() {
        return accion;
    }

    public void setAccion(Accion accion) {
        this.accion = accion;
    }

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "usuarioAutorizacion")
    public List<AutorizacionSeguimiento> getAutorizacionSeguimientoList() {
        return autorizacionSeguimientoList;
    }

    public void setAutorizacionSeguimientoList(List<AutorizacionSeguimiento> autorizacionSeguimientoList) {
        this.autorizacionSeguimientoList = autorizacionSeguimientoList;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (usuarioAutorizacionPK != null ? usuarioAutorizacionPK.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof UsuarioAutorizacion)) {
            return false;
        }
        UsuarioAutorizacion other = (UsuarioAutorizacion) object;
        if ((this.usuarioAutorizacionPK == null && other.usuarioAutorizacionPK != null) || (this.usuarioAutorizacionPK != null && !this.usuarioAutorizacionPK.equals(other.usuarioAutorizacionPK))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "pe.gob.foncodes.ssa.bs.seguridad.domain.UsuarioAutorizacion[ usuarioAutorizacionPK=" + usuarioAutorizacionPK + " ]";
    }
}
